/**
 * @file film.h
 * @brief Fichier d'entête du module film.
 *
 * @author Rachid Delory, Mamadou Keita, Florian Bernard
 */

#ifndef H_FILM_H
#define H_FILM_H

/* *********************************************************************

                       Librairies de film                           

********************************************************************* */

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include "utilitaireString.h"
#include "date.h"
#include "temps.h"

/* *********************************************************************

                        Définitions de types                           

********************************************************************* */

/**
 * @enum METRAGE
 * @brief Enum utilisé pour le métrage d'un film : long, moyen, court et aucun
 *
 */
enum METRAGE
  {
    AUCUN_FIL = 0,
    COURT_FIL = 1,
    MOYEN_FIL = 2,
    LONG_FIL = 3
  };

/**
 * @struct sFilm
 * @brief Structure utilisée pour la gestion des Film
 *
 * Cette structure est utilisée pour gérer un Film. Les champs de cette structure doivent être modifiés ou lus par les accesseurs et mutateurs. Ils doivent être initialisés et libérés avec les fonctions prévus à cette effet
 */
struct sFilm {
	int id; /** */
	int metrage; /** */
	Date *dateBlueRay; /** */
	Date *dateDvd; /** */
	Temps * duree; /** */
	Date *dateProduction; /** */
	char * synopsis; /** */
  char maj;
  char sup;
};
/**
 * @typedef Film
 * @brief Redéfinit la structure sFilm
 */
	typedef struct sFilm Film;

/* *********************************************************************

           Fonctions de la structure Film               

********************************************************************* */
/**
 * @fn void init_Fil(Film * ptr) ;
 * @brief Initialise un film en mémoire
 *
 * @param[in,out] ptr pointeur vers Film
 */
void init_Fil(Film *ptr);

/**
 * @fn void liberer_Fil(Film * ptr) ;
 * @brief Libere un film en mémoire
 *
 * @param[in,out] ptr pointeur vers Film
 */
void liberer_Fil(Film *ptr);

/**
 * @fn Film * creer_Fil() ;
 * @brief Crée un film en mémoire
 *
 * @return ptr pointeur vers Film
 */
Film * creer_Fil();

/**
 * @fn void detruire_Fil(Film ** ptr) ;
 * @brief Détruit un film en mémoire
 *
 * @param[in,out] ptr pointeur vers Film
 */
void detruire_Fil(Film **ptr);

/**
 * @fn void copier_Fil(Film **dest, const Film *src)
 * @brief copier dans dest src
 *
 * @param[in,out] dest
 * @param src
 */
void copier_Fil(Film **dest, const Film *src);

/* *********************************************************************

           Accesseurs et Mutateurs de la structure Film               

********************************************************************* */

/**
 * @fn int getId_Fil(const Film * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Film
 * @return int
 */
int getId_Fil(const Film * ptr) ;

/**
 * @fn void setId_Fil(Film *ptr, const int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Film.
 * @param val.
 */
void setId_Fil(Film *ptr, const int val) ;

/**
 * @fn int getMetrage_Fil(const Film * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Film
 * @return int
 */
int getMetrage_Fil(const Film  * ptr) ;

/**
 * @fn void setMetrage_Fil(Film *ptr, const int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Film.
 * @param val.
 */
void setMetrage_Fil(Film *ptr, const int val) ;

/**
 * @fn Date * getDateBlueRay_Fil(const Film  ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Film
 * @return Date
 */
Date *getDateBlueRay_Fil(const Film * ptr) ;

/**
 * @fn void setDateBlueRay_Fil(Film *ptr, const Date * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Film.
 * @param val.
 */
void setDateBlueRay_Fil(Film *ptr, const Date * val) ;

/**
 * @fn Date *getDateDvd_Fil(const Film * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Film
 * @return Date
 */
Date *getDateDvd_Fil(const Film * ptr) ;

/**
 * @fn void setDateDvd_Fil(Film *ptr, const Date * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Film.
 * @param val.
 */
void setDateDvd_Fil(Film *ptr, const Date *val) ;

/**
 * @fn Temps * getDuree_Fil(const Film *  ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Film
 * @return Temps
 */
Temps * getDuree_Fil(const Film *  ptr) ;

/**
 * @fn void setDuree_Fil(Film *ptr, const Temps * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Film.
 * @param val.
 */
void setDuree_Fil(Film *ptr, const Temps * val) ;

/**
 * @fn Date * getDateProduction_Fil(const Film *  ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Film
 * @return Date
 */
Date * getDateProduction_Fil(const Film *  ptr) ;

/**
 * @fn void setDateProduction_Fil(Film *ptr, const Date * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Film.
 * @param val.
 */
void setDateProduction_Fil(Film *ptr, const Date * val) ;

/**
 * @fn char * getSynopsis_Fil(const Film * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Film
 * @return char *
 */
char * getSynopsis_Fil(const Film * ptr) ;

/**
 * @fn void setSynopsis_Fil(Film *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Film.
 * @param val.
 */
void setSynopsis_Fil(Film *ptr, const char * val) ;

/**
 * @fn void setMaj_Fil(Film *ptr, const char b);
 * @brief Set le besoin de faire une mise à jour, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setMaj_Fil(Film *ptr, const char b);

/**
 * @fn char getMaj_Fil(const Film *ptr);
 * @brief Retourne 0 si pas besoin de faire la mise à jour, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getMaj_Fil(const Film *ptr);

/**
 * @fn void setSup_Fil(Film *ptr, const char b);
 * @brief Set le besoin de le supprimer, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setSup_Fil(Film *ptr, const char b);

/**
 * @fn char getSup_Fil(const Film *ptr);
 * @brief Retourne 0 si pas besoin de le supprimer, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getSup_Fil(const Film *ptr);

#endif
